/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jam.sfcc.common.data;

import jam.sfcc.common.domain.Caja;
import jam.sfcc.common.domain.Vendedor;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 *
 * @author Josué
 */
public class CajaData extends BaseData{

    public CajaData(String userName, String password) {
        super(userName, password);
    }
    public Caja getCierreDeCajaAnterior() throws SQLException{
        Caja caja=new Caja();
        Connection conexion=this.getConnection(); 
        String sqlSelectCaja="SELECT monto_de_cierre "
                           + "FROM caja "
                           + "ORDER BY cod_caja DESC LIMIT 1";
        PreparedStatement statement = conexion.prepareStatement(sqlSelectCaja);
        ResultSet resultSet= statement.executeQuery();
        if(resultSet.next()){
            caja.setMontoDeCierre(resultSet.getFloat("monto_de_cierre"));
        }
        statement.close();
        conexion.close();
        return caja;
    }
    public void abrirCaja(float montoInicial,Vendedor vendedor) throws SQLException{
        
        String sqlInsert="INSERT INTO caja(fecha,monto_inicial,id_vendedor)"
                       + "VALUES(now(),?,?)";
        Connection conexion=this.getConnection();
        PreparedStatement statement=conexion.prepareStatement(sqlInsert);
        statement.setFloat(1, montoInicial);
        statement.setInt(2, vendedor.getIdVendedor());
        statement.execute();
        
        statement.close();
        conexion.close();
    }
    public Caja calcularCaja(int idVendedor)throws SQLException{
        /*private int   codCaja;
          private Date  fecha;
          private float montoInicial;
          private float totalVentas;
          private float montoDeCierre;
          private float montoDeVentasContado;
          private float montoDeAbonosDeApartados;
          private float montoDeAbonosDeCreditos;
          private float excedente;
          private float faltante;
         */
        Caja caja = new Caja();
        String sqlSelectCaja="SELECT cod_caja,fecha,monto_inicial,id_vendedor "
                           + "FROM caja "
                           + "WHERE id_vendedor= "+idVendedor
                          + " ORDER BY cod_caja DESC LIMIT 1";
        Connection conexion=this.getConnection();
        
        PreparedStatement stmtSelectCaja = conexion.prepareStatement(sqlSelectCaja);
        ResultSet resultSetCaja= stmtSelectCaja.executeQuery();
        if(resultSetCaja.next()){
            caja.setCodCaja(resultSetCaja.getInt("cod_caja"));
            caja.setFecha(resultSetCaja.getDate("fecha"));
            caja.setMontoInicial(resultSetCaja.getFloat("monto_inicial"));
            caja.getVendedor().setIdVendedor(resultSetCaja.getInt("id_vendedor"));
        }
        stmtSelectCaja.close();
        /*******Total de ventas a crédito******/
        String sqlSelectVentasCredito="SELECT abono.monto_abono "
                + "FROM abono,cuentas_por_cobrar,orden "
                + "WHERE abono.cod_cuenta_por_cobrar = cuentas_por_cobrar.cod_cuenta_por_cobrar "
                + "and tipo_cuenta ='C' "
                + "and abono.fecha >= '"+new Date(caja.getFecha().getTime())+"' "
                + "and orden.cod_orden=cuentas_por_cobrar.cod_orden "
                + "and orden.id_vendedor="+idVendedor;
        PreparedStatement stmtVentasCredito=conexion.prepareStatement(sqlSelectVentasCredito);
        ResultSet resultSetVentasCredito=stmtVentasCredito.executeQuery();
        
        float totalVentasCredito=0;
        while(resultSetVentasCredito.next()){
            totalVentasCredito+=resultSetVentasCredito.getFloat("monto_abono");
        }
        caja.setMontoDeAbonosDeCreditos(totalVentasCredito);
        
        stmtVentasCredito.close();
        
        /*******Total de ventas por apartado******/
        String sqlSelectVentasApartado="SELECT abono.monto_abono "
                + "FROM abono,cuentas_por_cobrar,orden "
                + "WHERE abono.cod_cuenta_por_cobrar = cuentas_por_cobrar.cod_cuenta_por_cobrar "
                + "and tipo_cuenta ='A' "
                + "and abono.fecha >= '"+new Date(caja.getFecha().getTime())+"' "
                + "and orden.cod_orden=cuentas_por_cobrar.cod_orden "
                + "and orden.id_vendedor="+idVendedor;
        
        PreparedStatement stmtVentasApartado=conexion.prepareStatement(sqlSelectVentasApartado);
        ResultSet resultSetVentasApartado=stmtVentasApartado.executeQuery();
        
        float totalVentasApartado=0;
        while(resultSetVentasApartado.next()){
            totalVentasApartado+=resultSetVentasApartado.getFloat("monto_abono");
        }
        caja.setMontoDeAbonosDeApartados(totalVentasApartado);
        stmtVentasApartado.close();
        
        /********Total de ventas por contado*/
        String sqlSelectVentasContado="SELECT pago.monto_pago "
                + "FROM pago,orden "
                + "WHERE pago.cod_orden=orden.cod_orden "
                + "and id_vendedor= "+idVendedor
                + " and pago.fecha >= '"+new Date(caja.getFecha().getTime())+"'";
        
        PreparedStatement stmtVentasContado=conexion.prepareStatement(sqlSelectVentasContado);
        ResultSet resultSetVentasContado=stmtVentasContado.executeQuery();
        
        float totalVentasContado=0;
        while(resultSetVentasContado.next()){
            totalVentasContado+=resultSetVentasContado.getFloat("monto_pago");
        }
        
        caja.setMontoDeVentasContado(totalVentasContado);
        caja.setTotalVentas(totalVentasContado+totalVentasApartado+totalVentasCredito);
        stmtVentasContado.close();
        
        
        conexion.close();
        return caja;
    }
    public void cerrarCaja(Caja caja) throws SQLException{
        String sqlUpdate="UPDATE caja "
                       + "SET "
                       + "total_ventas = ?,monto_de_cierre = ?,monto_ventas_contado = ?, "
                       + "monto_abonos_apartados = ?,monto_abonos_credito = ?,excedente = ?, "
                       + "faltante = ? "
                       + "WHERE cod_caja=?";
        Connection conexion=this.getConnection();
        PreparedStatement statement=conexion.prepareStatement(sqlUpdate);
        statement.setFloat(1, caja.getTotalVentas());
        statement.setFloat(2, caja.getMontoDeCierre());
        statement.setFloat(3, caja.getMontoDeVentasContado());
        statement.setFloat(4, caja.getMontoDeAbonosDeApartados());
        statement.setFloat(5, caja.getMontoDeAbonosDeCreditos());
        statement.setFloat(6, caja.getExcedente());
        statement.setFloat(7, caja.getFaltante());
        statement.setInt(8, caja.getCodCaja());
        statement.execute();
        
        statement.close();
        conexion.close();
    }
    
}
